package delphorm.entite.questionnaire;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import delphorm.entite.personne.DroitQuestionnaire;
import delphorm.entite.personne.Utilisateur;



public class Questionnaire {
	private Long id;
	private Character etat;
	private Date datePublication;
	private Date dateCreation;
	private Date dateTest;
	private Date datePeremption;
	private Date dateModification;
	private String titre;
	private String info;
	private List<Question> questions;
	private Utilisateur auteur;
	
	//droits du propriétaire
	private DroitQuestionnaire droitsProprietaire;
	//droits des groupes associés
	private Set<DroitQuestionnaire> droitsGroupes;
	//droits des autres
	private DroitQuestionnaire droitsAutres;
	
	public Questionnaire()
	{
		questions = new ArrayList<Question>();
		droitsProprietaire = new DroitQuestionnaire(this);
		droitsGroupes = new HashSet<DroitQuestionnaire>();
		droitsAutres = new DroitQuestionnaire(this);
	}
	
	public List<Question> getQuestions() {
		return questions;
	}
	public void setQuestions(List<Question> questions) {
		this.questions = questions;
	}
	public Date getDateCreation() {
		return dateCreation;
	}
	public void setDateCreation(Date dateCreation) {
		this.dateCreation = dateCreation;
	}
	public Date getDatePeremption() {
		return datePeremption;
	}
	public void setDatePeremption(Date datePeremption) {
		this.datePeremption = datePeremption;
	}
	public Date getDatePublication() {
		return datePublication;
	}
	public void setDatePublication(Date datePublication) {
		this.datePublication = datePublication;
	}
	public Date getDateTest() {
		return dateTest;
	}
	public void setDateTest(Date dateTest) {
		this.dateTest = dateTest;
	}
	public Character getEtat() {
		return etat;
	}
	public void setEtat(Character etat) {
		this.etat = etat;
	}
	public String getInfo() {
		return info;
	}
	public void setInfo(String info) {
		this.info = info;
	}
	public String getTitre() {
		return titre;
	}
	public void setTitre(String titre) {
		this.titre = titre;
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	//cette méthode retourne la question correspondant à l'id
	public Question getQuestionParId(Integer idQuestion)
	{
		//les questions ne sont pas forcément dans l'ordre de leur identifiant dans l'ArrayList
		//qui les contient, il faut donc parcourir une par une les questions
		Iterator itQuestions = getQuestions().iterator();
		while(itQuestions.hasNext())
		{
			Question question = (Question)itQuestions.next();
			if(question.getId().equals(idQuestion))
			{
				return question;
			}
		}
		return null;
	}
	
	public Question supprimerQuestion(Integer idQuestion)
	{
		//récupère l'objet
		Question question = getQuestionParId(idQuestion);
		if(question == null)
			return null;
		//et le supprime
		getQuestions().remove(question);
		return question;
	}

	public Date getDateModification() {
		return dateModification;
	}

	public void setDateModification(Date dateModification) {
		this.dateModification = dateModification;
	}

	public Utilisateur getAuteur() {
		return auteur;
	}

	public void setAuteur(Utilisateur auteur) {
		this.auteur = auteur;
	}
	
	public void echangerQuestions(Integer idQ1, Integer idQ2)
	{
		Question temp = (Question)getQuestions().get(idQ1.intValue());
		Question Q2 = (Question)getQuestions().get(idQ2.intValue());
		getQuestions().set(idQ1.intValue(), Q2);
		getQuestions().set(idQ2.intValue(),temp);
	}

	public DroitQuestionnaire getDroitsAutres() {
		return droitsAutres;
	}

	public void setDroitsAutres(DroitQuestionnaire droitsAutres) {
		this.droitsAutres = droitsAutres;
	}

	public Set getDroitsGroupes() {
		return droitsGroupes;
	}

	public void setDroitsGroupes(Set<DroitQuestionnaire> droitsGroupes) {
		this.droitsGroupes = droitsGroupes;
	}

	public DroitQuestionnaire getDroitsProprietaire() {
		return droitsProprietaire;
	}

	public void setDroitsProprietaire(DroitQuestionnaire droitsProprietaire) {
		this.droitsProprietaire = droitsProprietaire;
	}
	
	public DroitQuestionnaire getDroitGroupe(String nomGroupe)
	{
		Iterator it = getDroitsGroupes().iterator();
		while(it.hasNext())
		{
			DroitQuestionnaire dq = (DroitQuestionnaire)it.next();
			if(dq.getGroupe().getNom().equals(nomGroupe))
				return dq;
		}
		
		return null;
	}
	
	public DroitQuestionnaire getNouveauDroitGroupe()
	{
		DroitQuestionnaire dq = new DroitQuestionnaire(this);
		droitsGroupes.add(dq);
		return dq;
	}
	
	//permet de supprimer les droits questionnaire qui n'ont pas de référence à un groupe
	//cela arrive si l'utilisateur crée un nouveau droitquestionnaire sans valider.
	//TODO découpler tout ça
	public void nettoyerDroitsGroupe()
	{
		Iterator it = getDroitsGroupes().iterator();
		while(it.hasNext())
		{
			DroitQuestionnaire dq = (DroitQuestionnaire)it.next();
			if(dq.getGroupe().getId() == null)
				droitsGroupes.remove(dq);
		}
	}
}
